/**
 * 判断是不是字符串类型
 */
const TypeIsString = (string) => {
	if (typeof(string) == 'string') {
		return true
	}
	return false
}

/**
 * 判断是不是date类型
 */
const TypeIsDate = (date) => {
	if (date instanceof Date) {
		const str = date.toString()
		if (TypeIsString(str) && str !== "Invalid Date") {
			return true
		}
	}
	return false
}

/**
 * 判断是不是数组类型
 */
const TypeIsArray = (array) => {
	if (Array.isArray(array)) {
		return true
	}
	return false
}

/**
 * 判断是不是对象类型
 */
const TypeIsObject = (obj) => {
	if (Object.prototype.toString.call(obj) === '[object Object]') {
		return true
	}
	return false
}

/**
 * 判断是不是布尔值类型
 */
const TypeIsBoolean = (string) => {
	if (typeof(string) == 'boolean') {
		return true
	}
	return false
}

/**
 * 判断是不是数值类型
 */
const TypeIsNumber = (string) => {
	if (typeof(string) == 'number') {
		return true
	}
	return false
}

/**
 * 判断是不是函数类型
 */
const TypeIsFunction = (string) => {
	if (typeof(string) == 'function') {
		return true
	}
	return false
}

/**
 * 判断函数的返回值是不是Promise类型
 * 该方法不需要通过执行函数，直接通过函数字符串判断
 * 该方法受限于正则表达式的局限性，只能判断函数是否包含 `return new Promise`
 */
const TypeIsReturnPromise = (func) => {
	if (typeof func === 'function' && func.name.endsWith('Async')) { // 异步函数其实也是返回Promise
		return true
	}
	const source = func.toString()
	// 简单正则：检查是否包含 `return new Promise`
	return /return\s+new\s+Promise\s*\(/.test(source)
}

module.exports = {
	TypeIsString,
	TypeIsDate,
	TypeIsArray,
	TypeIsObject,
	TypeIsBoolean,
	TypeIsNumber,
	TypeIsFunction,
	TypeIsReturnPromise
}